{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "executionInfo": {
     "elapsed": 7103,
     "status": "ok",
     "timestamp": 1649955991305,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "rnRofK9F_TnT"
   },
   "outputs": [],
   "source": [
    "import gym\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import rl_utils\n",
    "\n",
    "\n",
    "class PolicyNet(torch.nn.Module):\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim):\n",
    "        super(PolicyNet, self).__init__()\n",
    "        self.fc1 = torch.nn.Linear(state_dim, hidden_dim)\n",
    "        self.fc2 = torch.nn.Linear(hidden_dim, action_dim)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.fc1(x))\n",
    "        return F.softmax(self.fc2(x), dim=1)\n",
    "\n",
    "\n",
    "class ValueNet(torch.nn.Module):\n",
    "    def __init__(self, state_dim, hidden_dim):\n",
    "        super(ValueNet, self).__init__()\n",
    "        self.fc1 = torch.nn.Linear(state_dim, hidden_dim)\n",
    "        self.fc2 = torch.nn.Linear(hidden_dim, 1)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.fc1(x))\n",
    "        return self.fc2(x)\n",
    "\n",
    "\n",
    "class PPO:\n",
    "    ''' PPO算法,采用截断方式 '''\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim, actor_lr, critic_lr,\n",
    "                 lmbda, epochs, eps, gamma, device):\n",
    "        self.actor = PolicyNet(state_dim, hidden_dim, action_dim).to(device)\n",
    "        self.critic = ValueNet(state_dim, hidden_dim).to(device)\n",
    "        self.actor_optimizer = torch.optim.Adam(self.actor.parameters(),\n",
    "                                                lr=actor_lr)\n",
    "        self.critic_optimizer = torch.optim.Adam(self.critic.parameters(),\n",
    "                                                 lr=critic_lr)\n",
    "        self.gamma = gamma\n",
    "        self.lmbda = lmbda\n",
    "        self.epochs = epochs  # 一条序列的数据用来训练轮数\n",
    "        self.eps = eps  # PPO中截断范围的参数\n",
    "        self.device = device\n",
    "\n",
    "    def take_action(self, state):\n",
    "        state = torch.tensor([state], dtype=torch.float).to(self.device)\n",
    "        probs = self.actor(state)\n",
    "        action_dist = torch.distributions.Categorical(probs)\n",
    "        action = action_dist.sample()\n",
    "        return action.item()\n",
    "\n",
    "    def update(self, transition_dict):\n",
    "        states = torch.tensor(transition_dict['states'],\n",
    "                              dtype=torch.float).to(self.device)\n",
    "        actions = torch.tensor(transition_dict['actions']).view(-1, 1).to(\n",
    "            self.device)\n",
    "        rewards = torch.tensor(transition_dict['rewards'],\n",
    "                               dtype=torch.float).view(-1, 1).to(self.device)\n",
    "        next_states = torch.tensor(transition_dict['next_states'],\n",
    "                                   dtype=torch.float).to(self.device)\n",
    "        dones = torch.tensor(transition_dict['dones'],\n",
    "                             dtype=torch.float).view(-1, 1).to(self.device)\n",
    "        td_target = rewards + self.gamma * self.critic(next_states) * (1 -\n",
    "                                                                       dones)\n",
    "        td_delta = td_target - self.critic(states)\n",
    "        advantage = rl_utils.compute_advantage(self.gamma, self.lmbda,\n",
    "                                               td_delta.cpu()).to(self.device)\n",
    "        old_log_probs = torch.log(self.actor(states).gather(1,\n",
    "                                                            actions)).detach()\n",
    "\n",
    "        for _ in range(self.epochs):\n",
    "            log_probs = torch.log(self.actor(states).gather(1, actions))\n",
    "            ratio = torch.exp(log_probs - old_log_probs)\n",
    "            surr1 = ratio * advantage\n",
    "            surr2 = torch.clamp(ratio, 1 - self.eps,\n",
    "                                1 + self.eps) * advantage  # 截断\n",
    "            actor_loss = torch.mean(-torch.min(surr1, surr2))  # PPO损失函数\n",
    "            critic_loss = torch.mean(\n",
    "                F.mse_loss(self.critic(states), td_target.detach()))\n",
    "            self.actor_optimizer.zero_grad()\n",
    "            self.critic_optimizer.zero_grad()\n",
    "            actor_loss.backward()\n",
    "            critic_loss.backward()\n",
    "            self.actor_optimizer.step()\n",
    "            self.critic_optimizer.step()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 37845,
     "status": "ok",
     "timestamp": 1649956029144,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "-mccFiNn_TnV",
    "outputId": "48b888b5-d2a4-4505-e6cf-580efc7e782f"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Iteration 0:   0%|          | 0/50 [00:00<?, ?it/s]/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:43: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at  ../torch/csrc/utils/tensor_new.cpp:201.)\n",
      "Iteration 0: 100%|██████████| 50/50 [00:02<00:00, 19.41it/s, episode=50, return=183.200]\n",
      "Iteration 1: 100%|██████████| 50/50 [00:03<00:00, 13.49it/s, episode=100, return=184.900]\n",
      "Iteration 2: 100%|██████████| 50/50 [00:03<00:00, 12.64it/s, episode=150, return=200.000]\n",
      "Iteration 3: 100%|██████████| 50/50 [00:03<00:00, 12.64it/s, episode=200, return=200.000]\n",
      "Iteration 4: 100%|██████████| 50/50 [00:03<00:00, 12.81it/s, episode=250, return=200.000]\n",
      "Iteration 5: 100%|██████████| 50/50 [00:03<00:00, 12.63it/s, episode=300, return=200.000]\n",
      "Iteration 6: 100%|██████████| 50/50 [00:03<00:00, 12.83it/s, episode=350, return=200.000]\n",
      "Iteration 7: 100%|██████████| 50/50 [00:03<00:00, 12.58it/s, episode=400, return=200.000]\n",
      "Iteration 8: 100%|██████████| 50/50 [00:03<00:00, 12.78it/s, episode=450, return=200.000]\n",
      "Iteration 9: 100%|██████████| 50/50 [00:03<00:00, 12.59it/s, episode=500, return=187.200]\n"
     ]
    }
   ],
   "source": [
    "actor_lr = 1e-3\n",
    "critic_lr = 1e-2\n",
    "num_episodes = 500\n",
    "hidden_dim = 128\n",
    "gamma = 0.98\n",
    "lmbda = 0.95\n",
    "epochs = 10\n",
    "eps = 0.2\n",
    "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\n",
    "    \"cpu\")\n",
    "\n",
    "env_name = 'CartPole-v0'\n",
    "env = gym.make(env_name)\n",
    "env.seed(0)\n",
    "torch.manual_seed(0)\n",
    "state_dim = env.observation_space.shape[0]\n",
    "action_dim = env.action_space.n\n",
    "agent = PPO(state_dim, hidden_dim, action_dim, actor_lr, critic_lr, lmbda,\n",
    "            epochs, eps, gamma, device)\n",
    "\n",
    "return_list = rl_utils.train_on_policy_agent(env, agent, num_episodes)\n",
    "\n",
    "# Iteration 0: 100%|██████████| 50/50 [00:10<00:00,  4.81it/s, episode=50,\n",
    "# return=183.200]\n",
    "# Iteration 1: 100%|██████████| 50/50 [00:22<00:00,  2.24it/s, episode=100,\n",
    "# return=191.400]\n",
    "# Iteration 2: 100%|██████████| 50/50 [00:22<00:00,  2.24it/s, episode=150,\n",
    "# return=199.900]\n",
    "# Iteration 3: 100%|██████████| 50/50 [00:21<00:00,  2.33it/s, episode=200,\n",
    "# return=200.000]\n",
    "# Iteration 4: 100%|██████████| 50/50 [00:21<00:00,  2.29it/s, episode=250,\n",
    "# return=200.000]\n",
    "# Iteration 5: 100%|██████████| 50/50 [00:22<00:00,  2.22it/s, episode=300,\n",
    "# return=200.000]\n",
    "# Iteration 6: 100%|██████████| 50/50 [00:23<00:00,  2.14it/s, episode=350,\n",
    "# return=200.000]\n",
    "# Iteration 7: 100%|██████████| 50/50 [00:23<00:00,  2.16it/s, episode=400,\n",
    "# return=200.000]\n",
    "# Iteration 8: 100%|██████████| 50/50 [00:22<00:00,  2.23it/s, episode=450,\n",
    "# return=200.000]\n",
    "# Iteration 9: 100%|██████████| 50/50 [00:22<00:00,  2.25it/s, episode=500,\n",
    "# return=200.000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 573
    },
    "executionInfo": {
     "elapsed": 612,
     "status": "ok",
     "timestamp": 1649956030111,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "QDlFqdIM_TnW",
    "outputId": "673a3058-989e-4ce5-8dbd-31c1fe4bf830"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "episodes_list = list(range(len(return_list)))\n",
    "plt.plot(episodes_list, return_list)\n",
    "plt.xlabel('Episodes')\n",
    "plt.ylabel('Returns')\n",
    "plt.title('PPO on {}'.format(env_name))\n",
    "plt.show()\n",
    "\n",
    "mv_return = rl_utils.moving_average(return_list, 9)\n",
    "plt.plot(episodes_list, mv_return)\n",
    "plt.xlabel('Episodes')\n",
    "plt.ylabel('Returns')\n",
    "plt.title('PPO on {}'.format(env_name))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "executionInfo": {
     "elapsed": 7,
     "status": "ok",
     "timestamp": 1649956030112,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "fgCdOpTq_TnW"
   },
   "outputs": [],
   "source": [
    "class PolicyNetContinuous(torch.nn.Module):\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim):\n",
    "        super(PolicyNetContinuous, self).__init__()\n",
    "        self.fc1 = torch.nn.Linear(state_dim, hidden_dim)\n",
    "        self.fc_mu = torch.nn.Linear(hidden_dim, action_dim)\n",
    "        self.fc_std = torch.nn.Linear(hidden_dim, action_dim)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.fc1(x))\n",
    "        mu = 2.0 * torch.tanh(self.fc_mu(x))\n",
    "        std = F.softplus(self.fc_std(x))\n",
    "        return mu, std\n",
    "\n",
    "\n",
    "class PPOContinuous:\n",
    "    ''' 处理连续动作的PPO算法 '''\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim, actor_lr, critic_lr,\n",
    "                 lmbda, epochs, eps, gamma, device):\n",
    "        self.actor = PolicyNetContinuous(state_dim, hidden_dim,\n",
    "                                         action_dim).to(device)\n",
    "        self.critic = ValueNet(state_dim, hidden_dim).to(device)\n",
    "        self.actor_optimizer = torch.optim.Adam(self.actor.parameters(),\n",
    "                                                lr=actor_lr)\n",
    "        self.critic_optimizer = torch.optim.Adam(self.critic.parameters(),\n",
    "                                                 lr=critic_lr)\n",
    "        self.gamma = gamma\n",
    "        self.lmbda = lmbda\n",
    "        self.epochs = epochs\n",
    "        self.eps = eps\n",
    "        self.device = device\n",
    "\n",
    "    def take_action(self, state):\n",
    "        state = torch.tensor([state], dtype=torch.float).to(self.device)\n",
    "        mu, sigma = self.actor(state)\n",
    "        action_dist = torch.distributions.Normal(mu, sigma)\n",
    "        action = action_dist.sample()\n",
    "        return [action.item()]\n",
    "\n",
    "    def update(self, transition_dict):\n",
    "        states = torch.tensor(transition_dict['states'],\n",
    "                              dtype=torch.float).to(self.device)\n",
    "        actions = torch.tensor(transition_dict['actions'],\n",
    "                               dtype=torch.float).view(-1, 1).to(self.device)\n",
    "        rewards = torch.tensor(transition_dict['rewards'],\n",
    "                               dtype=torch.float).view(-1, 1).to(self.device)\n",
    "        next_states = torch.tensor(transition_dict['next_states'],\n",
    "                                   dtype=torch.float).to(self.device)\n",
    "        dones = torch.tensor(transition_dict['dones'],\n",
    "                             dtype=torch.float).view(-1, 1).to(self.device)\n",
    "        rewards = (rewards + 8.0) / 8.0  # 和TRPO一样,对奖励进行修改,方便训练\n",
    "        td_target = rewards + self.gamma * self.critic(next_states) * (1 -\n",
    "                                                                       dones)\n",
    "        td_delta = td_target - self.critic(states)\n",
    "        advantage = rl_utils.compute_advantage(self.gamma, self.lmbda,\n",
    "                                               td_delta.cpu()).to(self.device)\n",
    "        mu, std = self.actor(states)\n",
    "        action_dists = torch.distributions.Normal(mu.detach(), std.detach())\n",
    "        # 动作是正态分布\n",
    "        old_log_probs = action_dists.log_prob(actions)\n",
    "\n",
    "        for _ in range(self.epochs):\n",
    "            mu, std = self.actor(states)\n",
    "            action_dists = torch.distributions.Normal(mu, std)\n",
    "            log_probs = action_dists.log_prob(actions)\n",
    "            ratio = torch.exp(log_probs - old_log_probs)\n",
    "            surr1 = ratio * advantage\n",
    "            surr2 = torch.clamp(ratio, 1 - self.eps, 1 + self.eps) * advantage\n",
    "            actor_loss = torch.mean(-torch.min(surr1, surr2))\n",
    "            critic_loss = torch.mean(\n",
    "                F.mse_loss(self.critic(states), td_target.detach()))\n",
    "            self.actor_optimizer.zero_grad()\n",
    "            self.critic_optimizer.zero_grad()\n",
    "            actor_loss.backward()\n",
    "            critic_loss.backward()\n",
    "            self.actor_optimizer.step()\n",
    "            self.critic_optimizer.step()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 210368,
     "status": "ok",
     "timestamp": 1649956240475,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "zFwPi7ny_TnX",
    "outputId": "030c60e6-44ee-4901-f3c1-4f5946309869"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Iteration 0: 100%|██████████| 200/200 [00:22<00:00,  9.02it/s, episode=200, return=-1000.354]\n",
      "Iteration 1: 100%|██████████| 200/200 [00:22<00:00,  8.78it/s, episode=400, return=-922.780]\n",
      "Iteration 2: 100%|██████████| 200/200 [00:20<00:00,  9.63it/s, episode=600, return=-483.957]\n",
      "Iteration 3: 100%|██████████| 200/200 [00:20<00:00,  9.80it/s, episode=800, return=-472.933]\n",
      "Iteration 4: 100%|██████████| 200/200 [00:20<00:00,  9.54it/s, episode=1000, return=-327.589]\n",
      "Iteration 5: 100%|██████████| 200/200 [00:20<00:00,  9.63it/s, episode=1200, return=-426.262]\n",
      "Iteration 6: 100%|██████████| 200/200 [00:20<00:00,  9.73it/s, episode=1400, return=-224.806]\n",
      "Iteration 7: 100%|██████████| 200/200 [00:21<00:00,  9.49it/s, episode=1600, return=-279.722]\n",
      "Iteration 8: 100%|██████████| 200/200 [00:20<00:00,  9.62it/s, episode=1800, return=-428.538]\n",
      "Iteration 9: 100%|██████████| 200/200 [00:20<00:00,  9.81it/s, episode=2000, return=-235.771]\n"
     ]
    }
   ],
   "source": [
    "actor_lr = 1e-4\n",
    "critic_lr = 5e-3\n",
    "num_episodes = 2000\n",
    "hidden_dim = 128\n",
    "gamma = 0.9\n",
    "lmbda = 0.9\n",
    "epochs = 10\n",
    "eps = 0.2\n",
    "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\n",
    "    \"cpu\")\n",
    "\n",
    "env_name = 'Pendulum-v0'\n",
    "env = gym.make(env_name)\n",
    "env.seed(0)\n",
    "torch.manual_seed(0)\n",
    "state_dim = env.observation_space.shape[0]\n",
    "action_dim = env.action_space.shape[0]  # 连续动作空间\n",
    "agent = PPOContinuous(state_dim, hidden_dim, action_dim, actor_lr, critic_lr,\n",
    "                      lmbda, epochs, eps, gamma, device)\n",
    "\n",
    "return_list = rl_utils.train_on_policy_agent(env, agent, num_episodes)\n",
    "\n",
    "# Iteration 0: 100%|██████████| 200/200 [02:15<00:00,  1.47it/s, episode=200,\n",
    "# return=-984.137]\n",
    "# Iteration 1: 100%|██████████| 200/200 [02:17<00:00,  1.45it/s, episode=400,\n",
    "# return=-895.332]\n",
    "# Iteration 2: 100%|██████████| 200/200 [02:14<00:00,  1.48it/s, episode=600,\n",
    "# return=-518.916]\n",
    "# Iteration 3: 100%|██████████| 200/200 [02:19<00:00,  1.44it/s, episode=800,\n",
    "# return=-602.183]\n",
    "# Iteration 4: 100%|██████████| 200/200 [02:17<00:00,  1.45it/s, episode=1000,\n",
    "# return=-392.104]\n",
    "# Iteration 5: 100%|██████████| 200/200 [02:17<00:00,  1.45it/s, episode=1200,\n",
    "# return=-259.206]\n",
    "# Iteration 6: 100%|██████████| 200/200 [02:17<00:00,  1.45it/s, episode=1400,\n",
    "# return=-221.772]\n",
    "# Iteration 7: 100%|██████████| 200/200 [02:17<00:00,  1.45it/s, episode=1600,\n",
    "# return=-293.515]\n",
    "# Iteration 8: 100%|██████████| 200/200 [02:17<00:00,  1.45it/s, episode=1800,\n",
    "# return=-371.194]\n",
    "# Iteration 9: 100%|██████████| 200/200 [02:17<00:00,  1.45it/s, episode=2000,\n",
    "# return=-248.958]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 573
    },
    "executionInfo": {
     "elapsed": 1123,
     "status": "ok",
     "timestamp": 1649956241594,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "_lQ85nCC_TnY",
    "outputId": "39e0bfd7-e54e-4e0d-890a-bdf696a16534"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "episodes_list = list(range(len(return_list)))\n",
    "plt.plot(episodes_list, return_list)\n",
    "plt.xlabel('Episodes')\n",
    "plt.ylabel('Returns')\n",
    "plt.title('PPO on {}'.format(env_name))\n",
    "plt.show()\n",
    "\n",
    "mv_return = rl_utils.moving_average(return_list, 21)\n",
    "plt.plot(episodes_list, mv_return)\n",
    "plt.xlabel('Episodes')\n",
    "plt.ylabel('Returns')\n",
    "plt.title('PPO on {}'.format(env_name))\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "第12章-PPO算法.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
